In [18]:
import pandas as pd
import numpy as np
import geopandas as gpd
import folium
from datetime import datetime
import mglearn
from tqdm import tqdm
from pandas import DataFrame
import matplotlib.pyplot as plt
import folium

plt.rc('font', family='Malgun Gothic')
In [19]:
교통사고내역 = pd.read_csv('1.대전광역시_교통사고내역(2017~2019).csv')
교통사고격자 = gpd.read_file('2.대전광역시_교통사고격자(2017~2019).geojson')
In [3]:
# 교통안전시설물 data loading
교통사고격자 = gpd.read_file('2.대전광역시_교통사고격자(2017~2019).geojson')
신호등_보행등 = gpd.read_file("3.대전광역시_신호등(보행등).geojson")
신호등_차량등 = gpd.read_file("4.대전광역시_신호등(차량등).geojson")
안전지대 = gpd.read_file("5.대전광역시_안전지대.geojson")
횡단보도 = gpd.read_file("6.대전광역시_횡단보도.geojson")
도로속도표시 = gpd.read_file("7.대전광역시_도로속도표시.geojson")
정차금지지대 = gpd.read_file("8.대전광역시_정차금지지대.geojson")
교통안전표지 = gpd.read_file("9.대전광역시_교통안전표지.geojson")
교통CCTV = gpd.read_file("10.대전광역시_교통CCTV.geojson")
중앙분리대 = gpd.read_file("31.대전시_중앙분리대.geojson")
In [4]:
동별_인구현황 = pd.read_csv('11.대전광역시_동별_인구현황(2017~2019).csv')
인구정보_총인구 = gpd.read_file('12.대전광역시_인구정보(총인구).geojson')
인구정보_고령 = gpd.read_file('13.대전광역시_인구정보(고령).geojson')
인구정보_생산가능 = gpd.read_file('14.대전광역시_인구정보(생산가능).geojson')
인구정보_유소년 = gpd.read_file('15.대전광역시_인구정보(유소년).geojson')
기상데이터 = pd.read_csv('16.대전광역시_기상데이터(2017~2019).csv')
차량등록현황 = gpd.read_file('30.대전광역시_차량등록현황_격자.geojson')
도로명주소_건물 = gpd.read_file('23.대전광역시_도로명주소(건물).geojson')
In [5]:
평일_일별_혼잡빈도강도 = pd.read_csv("21.대전광역시_평일_일별_혼잡빈도강도(2018).csv")
평일_일별_시간대별_추정교통량 = pd.read_csv("20.대전광역시_평일_일별_시간대별_추정교통량(2018).csv")
/opt/app-root/lib/python3.6/site-packages/IPython/core/interactiveshell.py:3072: DtypeWarning: Columns (7) have mixed types.Specify dtype option on import or set low_memory=False.
  interactivity=interactivity, compiler=compiler, result=result)
In [69]:
교통사고내역 = pd.read_csv('1.대전광역시_교통사고내역(2017~2019).csv')
In [6]:
교통사고내역.head()
Out[6]:
사고일 시군구 사고유형 법규위반 사고내용 사망자수 중상자수 경상자수 부상신고자수 가해운전자 차종 가해운전자 연령대 가해운전자 성별 피해운전자 차종 피해운전자 연령대 피해운전자 성별 gid
0 2017-01-01 대전광역시 서구 용문동 차대차 - 측면충돌 안전운전불이행 중상사고 0 1 1 0 승용 50대 승용 60대 다바905151
1 2017-01-01 대전광역시 서구 탄방동 차대차 - 추돌 안전운전불이행 경상사고 0 0 1 0 승용 50대 승용 30대 다바905166
2 2017-01-01 대전광역시 서구 둔산동 차대사람 - 횡단중 안전운전불이행 중상사고 0 1 0 0 승용 30대 보행자 10대 다바888169
3 2017-01-01 대전광역시 대덕구 오정동 차대차 - 추돌 안전운전불이행 경상사고 0 0 2 0 승용 50대 승합 40대 다바917174
4 2017-01-01 대전광역시 유성구 노은동 차대사람 - 횡단중 안전운전불이행 경상사고 0 0 1 0 승용 80대 보행자 10대미만 다바841191
In [22]:
aa = 교통사고내역.loc[교통사고내역['피해운전자 연령대'] == '10대미만'].groupby(['시군구'])[['gid']].count().sort_values(by='gid', ascending=False)[:10]
pd.set_option('display.max_rows', aa.shape[0]+1)
aa
Out[22]:
gid
시군구
대전광역시 서구 갈마동 14
대전광역시 서구 관저동 10
대전광역시 중구 문화동 10
대전광역시 서구 괴정동 10
대전광역시 중구 유천동 9
대전광역시 서구 둔산동 8
대전광역시 서구 월평동 8
대전광역시 서구 탄방동 8
대전광역시 유성구 송강동 8
대전광역시 서구 가장동 7
In [28]:
bb = 교통사고내역.loc[교통사고내역['피해운전자 연령대'] == '10대'].groupby(['시군구'])[['gid']].count().sort_values(by='gid', ascending=False)
pd.set_option('display.max_rows', bb.shape[0]+1)
bb
Out[28]:
gid
시군구
대전광역시 서구 둔산동 99
대전광역시 서구 갈마동 47
대전광역시 유성구 봉명동 31
대전광역시 서구 탄방동 25
대전광역시 서구 관저동 24
대전광역시 서구 월평동 23
대전광역시 동구 가양동 23
대전광역시 서구 도마동 20
대전광역시 중구 유천동 19
대전광역시 유성구 관평동 18
대전광역시 유성구 지족동 18
대전광역시 대덕구 중리동 18
대전광역시 동구 자양동 17
대전광역시 중구 대흥동 16
대전광역시 대덕구 송촌동 15
대전광역시 동구 대동 15
대전광역시 동구 용전동 14
대전광역시 중구 문화동 14
대전광역시 중구 태평동 13
대전광역시 유성구 원내동 12
대전광역시 유성구 전민동 12
대전광역시 중구 선화동 12
대전광역시 유성구 궁동 12
대전광역시 서구 복수동 12
대전광역시 대덕구 오정동 12
대전광역시 서구 괴정동 11
대전광역시 동구 가오동 10
대전광역시 유성구 반석동 10
대전광역시 서구 내동 10
대전광역시 동구 삼성동 10
대전광역시 중구 부사동 10
대전광역시 유성구 노은동 10
대전광역시 서구 만년동 10
대전광역시 중구 은행동 9
대전광역시 대덕구 법동 9
대전광역시 유성구 구암동 9
대전광역시 서구 정림동 9
대전광역시 유성구 장대동 9
대전광역시 중구 산성동 8
대전광역시 중구 중촌동 7
대전광역시 대덕구 비래동 7
대전광역시 동구 대성동 7
대전광역시 유성구 상대동 6
대전광역시 중구 오류동 6
대전광역시 유성구 송강동 6
대전광역시 대덕구 석봉동 6
대전광역시 서구 용문동 6
대전광역시 유성구 죽동 6
대전광역시 서구 가수원동 6
대전광역시 중구 용두동 6
대전광역시 동구 홍도동 6
대전광역시 동구 판암동 5
대전광역시 대덕구 덕암동 4
대전광역시 동구 용운동 4
대전광역시 동구 성남동 4
대전광역시 유성구 원신흥동 4
대전광역시 대덕구 목상동 4
대전광역시 서구 도안동 3
대전광역시 동구 천동 3
대전광역시 유성구 하기동 3
대전광역시 동구 원동 3
대전광역시 유성구 어은동 3
대전광역시 동구 인동 3
대전광역시 동구 중동 3
대전광역시 유성구 도룡동 3
대전광역시 서구 변동 3
대전광역시 대덕구 읍내동 3
대전광역시 유성구 덕명동 2
대전광역시 유성구 봉산동 2
대전광역시 동구 정동 2
대전광역시 동구 신흥동 2
대전광역시 유성구 신성동 2
대전광역시 중구 문창동 2
대전광역시 중구 석교동 2
대전광역시 중구 대사동 2
대전광역시 서구 가장동 2
대전광역시 유성구 탑립동 2
대전광역시 대덕구 대화동 2
대전광역시 중구 목동 1
대전광역시 대덕구 미호동 1
대전광역시 중구 옥계동 1
대전광역시 동구 소제동 1
대전광역시 대덕구 상서동 1
대전광역시 유성구 장동 1
대전광역시 동구 상소동 1
대전광역시 동구 주촌동 1
대전광역시 동구 추동 1
대전광역시 동구 효동 1
대전광역시 동구 낭월동 1
대전광역시 동구 구도동 1
대전광역시 대덕구 평촌동 1
대전광역시 서구 흑석동 1
대전광역시 유성구 계산동 1
대전광역시 유성구 교촌동 1
대전광역시 대덕구 신탄진동 1
대전광역시 유성구 용계동 1
대전광역시 대덕구 신일동 1
대전광역시 유성구 원촌동 1
대전광역시 유성구 자운동 1
대전광역시 유성구 대정동 1
In [24]:
bb = 교통사고내역.loc[(교통사고내역['피해운전자 연령대'] == '10대') | (교통사고내역['피해운전자 연령대'] == '20대')
                      | (교통사고내역['피해운전자 연령대'] == '30대') | (교통사고내역['피해운전자 연령대'] == '40대') | (교통사고내역['피해운전자 연령대'] == '50대')].groupby(['시군구'])[['gid']].count().sort_values(by='gid', ascending=False)[:10]
In [25]:
pd.set_option('display.max_rows', bb.shape[0]+1)
bb
Out[25]:
gid
시군구
대전광역시 서구 둔산동 1642
대전광역시 유성구 봉명동 860
대전광역시 서구 갈마동 775
대전광역시 서구 월평동 688
대전광역시 서구 탄방동 580
대전광역시 대덕구 오정동 434
대전광역시 유성구 장대동 391
대전광역시 동구 용전동 376
대전광역시 동구 가양동 375
대전광역시 대덕구 중리동 343
In [26]:
cc = 교통사고내역.loc[(교통사고내역['피해운전자 연령대'] == '50대') | (교통사고내역['피해운전자 연령대'] == '60대')
                      | (교통사고내역['피해운전자 연령대'] == '70대') | (교통사고내역['피해운전자 연령대'] == '80대') | (교통사고내역['피해운전자 연령대'] == '90대')].groupby(['시군구'])[['gid']].count().sort_values(by='gid', ascending=False)[:10]
In [27]:
pd.set_option('display.max_rows', cc.shape[0]+1)
cc
Out[27]:
gid
시군구
대전광역시 서구 둔산동 623
대전광역시 유성구 봉명동 407
대전광역시 서구 월평동 356
대전광역시 서구 갈마동 322
대전광역시 대덕구 오정동 258
대전광역시 동구 가양동 238
대전광역시 서구 탄방동 233
대전광역시 동구 용전동 212
대전광역시 서구 도마동 195
대전광역시 대덕구 중리동 189
In [ ]:
 
In [6]:
교통사고내역['사고일'] = 교통사고내역['사고일'].map(lambda x : datetime.strptime(str(x), '%Y-%m-%d'))
In [7]:
교통사고내역['year'] = 교통사고내역['사고일'].map(lambda x : x.strftime('%Y'))
교통사고내역['month'] = 교통사고내역['사고일'].map(lambda x : x.strftime('%m'))
교통사고내역['day'] = 교통사고내역['사고일'].map(lambda x : x.strftime('%d'))
In [8]:
교통사고내역['사고'] = 교통사고내역['사고유형'].str.split('-').str[0].str.strip()
In [9]:
교통사고내역['유형'] = 교통사고내역['사고유형'].str.split('-').str[1].str.strip()
In [10]:
교통사고내역['구'] = 교통사고내역['시군구'].str.split(' ').str[1]
In [11]:
교통사고내역['동'] = 교통사고내역['시군구'].str.split(' ').str[2]
In [12]:
traffic = pd.merge(교통사고내역,교통사고격자, on='gid')
In [13]:
traffic
Out[13]:
사고일 시군구 사고유형 법규위반 사고내용 사망자수 중상자수 경상자수 부상신고자수 가해운전자 차종 ... gid year month day 사고 유형 acci_cnt geometry
0 2017-01-01 대전광역시 서구 용문동 차대차 - 측면충돌 안전운전불이행 중상사고 0 1 1 0 승용 ... 다바905151 2017 01 01 차대차 측면충돌 서구 용문동 4 MULTIPOLYGON (((127.39415 36.33323, 127.39415 ...
1 2017-03-22 대전광역시 서구 용문동 차대차 - 측면충돌 안전거리미확보 중상사고 0 1 0 0 승용 ... 다바905151 2017 03 22 차대차 측면충돌 서구 용문동 4 MULTIPOLYGON (((127.39415 36.33323, 127.39415 ...
2 2019-05-08 대전광역시 서구 용문동 차대차 - 추돌 안전운전불이행 경상사고 0 0 1 0 승용 ... 다바905151 2019 05 08 차대차 추돌 서구 용문동 4 MULTIPOLYGON (((127.39415 36.33323, 127.39415 ...
3 2019-11-28 대전광역시 서구 용문동 차대차 - 측면충돌 안전운전불이행 경상사고 0 0 1 0 승용 ... 다바905151 2019 11 28 차대차 측면충돌 서구 용문동 4 MULTIPOLYGON (((127.39415 36.33323, 127.39415 ...
4 2017-01-01 대전광역시 서구 탄방동 차대차 - 추돌 안전운전불이행 경상사고 0 0 1 0 승용 ... 다바905166 2017 01 01 차대차 추돌 서구 탄방동 4 MULTIPOLYGON (((127.39413 36.34676, 127.39413 ...
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
23647 2018-07-17 대전광역시 서구 오동 차량단독 - 기타 기타 중상사고 0 1 0 0 승합 ... 다바822030 2018 07 17 차량단독 기타 서구 오동 1 MULTIPOLYGON (((127.30194 36.22403, 127.30194 ...
23648 2018-10-17 대전광역시 서구 매노동 차대차 - 기타 안전운전불이행 사망사고 1 0 0 0 이륜 ... 다바842052 2018 10 17 차대차 기타 서구 매노동 1 MULTIPOLYGON (((127.32415 36.24390, 127.32415 ...
23649 2018-10-20 대전광역시 서구 흑석동 차대사람 - 횡단중 안전운전불이행 중상사고 0 1 0 0 승용 ... 다바857061 2018 10 20 차대사람 횡단중 서구 흑석동 1 MULTIPOLYGON (((127.34083 36.25203, 127.34083 ...
23650 2018-10-23 대전광역시 서구 우명동 차대차 - 측면충돌 중앙선침범 경상사고 0 0 1 0 승용 ... 다바822036 2018 10 23 차대차 측면충돌 서구 우명동 1 MULTIPOLYGON (((127.30193 36.22944, 127.30192 ...
23651 2019-12-31 대전광역시 중구 부사동 차대사람 - 기타 안전운전불이행 중상사고 0 1 0 0 승용 ... 다바941131 2019 12 31 차대사람 기타 중구 부사동 1 MULTIPOLYGON (((127.43427 36.31523, 127.43427 ...

23652 rows × 25 columns

In [13]:
# 결측치 확인

교통사고내역.isnull().sum()
Out[13]:
사고일            0
시군구            0
사고유형           0
법규위반           0
사고내용           0
사망자수           0
중상자수           0
경상자수           0
부상신고자수         0
가해운전자 차종       0
가해운전자 연령대      0
가해운전자 성별       0
피해운전자 차종     671
피해운전자 연령대    671
피해운전자 성별     671
gid            0
year           0
month          0
day            0
사고             0
유형             0
구              0
동              0
dtype: int64
In [14]:
# 피해자운전자 정보가 없는 671건 모두 차량단독 사고

교통사고내역[(교통사고내역['피해운전자 차종'].isnull()) & (교통사고내역['사고'] != '차량단독')]
Out[14]:
사고일 시군구 사고유형 법규위반 사고내용 사망자수 중상자수 경상자수 부상신고자수 가해운전자 차종 ... 피해운전자 연령대 피해운전자 성별 gid year month day 사고 유형

0 rows × 23 columns

In [15]:
# 이상치 확인
In [16]:
교통사고내역['가해운전자 연령대'].unique()
Out[16]:
array(['50', '30', '80', '70', '60', '20', '미분류', '40', '10', '90',
       '기타불명'], dtype=object)
In [17]:
교통사고내역['피해운전자 연령대'].unique()
Out[17]:
array(['60', '30', '10', '40', '50', '70', nan, '20', '미분류', '80', '90'],
      dtype=object)
In [18]:
교통사고내역['가해운전자 차종'].unique()
Out[18]:
array(['승용', '기타불명', '화물', '자전거', '승합', '원동기', '건설기계', '특수', '이륜',
       '개인형이동수단(PM)', '사륜오토바이(ATV)', '농기계'], dtype=object)
In [19]:
교통사고내역['사망자수'].unique()
Out[19]:
array([0, 1, 2])
In [20]:
교통사고내역['중상자수'].unique()
Out[20]:
array([ 1,  0,  3,  2,  4,  5,  6,  7, 16])
In [21]:
교통사고내역.loc[교통사고내역['중상자수']==16, ['가해운전자 차종','피해운전자 차종']]
Out[21]:
가해운전자 차종 피해운전자 차종
18656 승합 승용
In [22]:
교통사고내역['경상자수'].unique()
Out[22]:
array([ 1,  0,  2,  4,  6,  3,  5,  9,  7,  8, 10, 12, 13, 16, 18, 14, 11,
       19])
In [85]:
교통사고내역.loc[교통사고내역['경상자수'] ==19, ['가해운전자 차종','피해운전자 차종']]
Out[85]:
가해운전자 차종 피해운전자 차종
20363 승용 승합
In [86]:
교통사고내역['부상신고자수'].unique()
Out[86]:
array([ 0,  1,  2,  5, 12,  4,  3, 11,  8,  6,  9,  7, 10])
In [89]:
교통사고내역.loc[교통사고내역['부상신고자수'] ==12]
Out[89]:
사고일 시군구 사고유형 법규위반 사고내용 사망자수 중상자수 경상자수 부상신고자수 가해운전자 차종 ... 피해운전자 연령대 피해운전자 성별 gid year month day 사고 유형
1213 2017-03-25 대전광역시 서구 도마동 차대차 - 측면충돌 안전거리미확보 중상사고 0 1 1 12 화물 ... 50 다바890137 2017 03 25 차대차 측면충돌 서구 도마동

1 rows × 23 columns

In [19]:
 
In [ ]:
 
In [14]:
# 2017-2019 사고 수
v1 = traffic.groupby(['year'])[['acci_cnt']].count()
In [15]:
v1.head()
Out[15]:
acci_cnt
year
2017 7759
2018 7552
2019 8341
In [22]:
plt.plot(v1, marker='o')
plt.xlabel('사고연도')     # x축 이름
plt.ylabel('발생사고수')       # y축 이름
plt.ylim([7000,9000])          # y축 범위
plt.title('대전시 교통사고 발생건수')       
Out[22]:
Text(0.5,1,'대전시 교통사고 발생건수')
In [73]:
mm = traffic.groupby(['year'])[['사망자수', '중상자수', '경상자수']].sum()
In [54]:
mm.reset_index(inplace=True)
mm.head()
Out[54]:
year 사망자수 중상자수 경상자수
0 2017 86 2233 9139
1 2018 93 2035 8907
2 2019 77 1982 10083
In [77]:
mmm = mm.T
mmm.reset_index(inplace=True)
In [78]:
mmm.head()
Out[78]:
year index 2017 2018 2019
0 사망자수 86 93 77
1 중상자수 2233 2035 1982
2 경상자수 9139 8907 10083
In [103]:
x = np.arange(len(mmm['index']))  # the label locations
width = 0.25  # the width of the bars

fig, ax = plt.subplots()
rects1 = ax.bar(x, mmm['2017'], width, label='2017', color='#9acfff')
rects2 = ax.bar(x + width, mmm['2018'], width, label='2018', color='#a89aff')
rects3 = ax.bar(x + width + width, mmm['2019'], width, label='2019', color='#EE3224')

# Add some text for labels, title and custom x-axis tick labels, etc.
ax.set_ylabel('수')
ax.set_title('대전시 교통사고')
# ax.set_xticks(x)
ax.set_xticklabels(mmm['index'])
ax.set_xticks(x + width / 2)
ax.legend()

for bar in ax.patches:
  bar_value = bar.get_height()
  # Format the text with commas to separate thousands. You can do
  # any type of formatting here though.
  text = f'{bar_value:,}'
  # This will give the middle of each bar on the x-axis.
  text_x = bar.get_x() + bar.get_width() / 2
  # get_y() is where the bar starts so we add the height to it.
  text_y = bar.get_y() + bar_value
  # If we want the text to be the same color as the bar, we can
  # get the color like so:
  bar_color = bar.get_facecolor()
  # If you want a consistent color, you can just set it as a constant, e.g. #222222
  ax.text(text_x, text_y, text, ha='center', va='bottom', color=bar_color,
          size=10)

# Setting the x-axis and y-axis limits
plt.xlim(min(x)-width, max(x)+width*4)
plt.ylim([0, max(1000 + mmm['2019'])] )
   
          
          
fig.tight_layout()

plt.show()
/opt/app-root/lib/python3.6/site-packages/ipykernel_launcher.py:16: UserWarning: FixedFormatter should only be used together with FixedLocator
  app.launch_new_instance()
In [ ]:
 
In [14]:
# 2017 ~ 2019 사고 
acci_100 = traffic.groupby(['동'])[['acci_cnt']].count().sort_values(by='acci_cnt', ascending=False)[:100]
pd.set_option('display.max_rows', acci_100.shape[0]+1)
acci_100
Out[14]:
acci_cnt
둔산동 1944
봉명동 1064
갈마동 961
월평동 882
탄방동 711
오정동 571
가양동 527
용전동 498
장대동 492
도마동 443
중리동 438
대흥동 435
구암동 424
관저동 386
삼성동 343
선화동 340
문화동 339
유천동 337
괴정동 335
태평동 329
노은동 325
용문동 311
궁동 307
오류동 306
관평동 284
지족동 263
원내동 263
산성동 239
송촌동 234
만년동 226
내동 216
성남동 215
중촌동 208
용두동 203
비래동 200
가수원동 196
대동 196
판암동 195
신탄진동 190
대사동 187
반석동 185
법동 185
원신흥동 183
가오동 181
복수동 178
도룡동 177
변동 175
은행동 172
송강동 165
자양동 164
읍내동 164
홍도동 159
용운동 152
가장동 151
부사동 144
인동 142
도안동 137
중동 135
대화동 127
전민동 127
정림동 125
원동 123
상대동 117
상서동 110
덕암동 107
덕명동 106
신대동 104
정동 102
신성동 99
석봉동 99
방동 94
신흥동 94
목상동 92
죽동 90
대성동 88
신일동 86
화암동 80
문창동 78
석교동 77
소제동 76
목동 72
사정동 67
봉산동 66
하기동 65
구성동 65
천동 64
용산동 64
용계동 62
낭월동 60
문평동 59
옥계동 57
문지동 56
안영동 54
탑립동 53
갑동 52
어은동 51
교촌동 49
효동 49
대정동 46
계산동 45
In [27]:
acci_20 = acci_100[:20]
acci_20
Out[27]:
acci_cnt
둔산동 1944
봉명동 1064
갈마동 961
월평동 882
탄방동 711
오정동 571
가양동 527
용전동 498
장대동 492
도마동 443
중리동 438
대흥동 435
구암동 424
관저동 386
삼성동 343
선화동 340
문화동 339
유천동 337
괴정동 335
태평동 329
In [29]:
from matplotlib.ticker import StrMethodFormatter

ax = acci_20.plot(kind='barh', figsize=(8, 10), color='#86bf91', zorder=2, width=0.85)

ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
ax.spines['left'].set_visible(False)
ax.spines['bottom'].set_visible(False)

  # Switch off ticks
ax.tick_params(axis="both", which="both", bottom="off", top="off", labelbottom="on", left="off", right="off", labelleft="on")

  # Draw vertical axis lines
vals = ax.get_xticks()
for tick in vals:
    ax.axvline(x=tick, linestyle='dashed', alpha=0.4, color='#eeeeee', zorder=1)

  # Set x-axis label
ax.set_xlabel("사고 발생건수", labelpad=20, weight='bold', size=12)

  # Set y-axis label
ax.set_ylabel('Top20 동이름', labelpad=20, weight='bold', size=12)

  # Format y-axis label
ax.xaxis.set_major_formatter(StrMethodFormatter('{x:,g}'))
ax.invert_yaxis()
In [33]:
acc_2 = traffic.groupby(['year','동'])[['acci_cnt']].sum()
In [34]:
pd.set_option('display.max_rows', acc_2.shape[0]+1)
acc_2
Out[34]:
acci_cnt
year
2017 가수원동 514
가양동 1932
가오동 451
가장동 438
가정동 12
갈마동 5286
갑동 112
계산동 171
관저동 680
관평동 595
괴곡동 10
괴정동 1069
교촌동 35
구도동 25
구룡동 2
구성동 123
구암동 1978
궁동 1303
금고동 2
금동 1
낭월동 58
내동 599
노은동 1586
대동 723
대별동 5
대사동 758
대성동 172
대정동 49
대화동 177
대흥동 1649
덕명동 468
덕암동 265
덕진동 30
도룡동 655
도마동 1257
도안동 268
둔곡동 7
둔산동 12888
마산동 1
만년동 757
매노동 1
목달동 1
목동 146
목상동 288
문지동 55
문창동 256
문평동 150
문화동 944
미호동 5
반석동 1032
방동 121
방현동 20
법동 485
변동 717
복수동 503
복용동 70
봉곡동 1
봉명동 4254
봉산동 206
부사동 1033
비래동 534
비룡동 4
사성동 1
사정동 58
산성동 608
삼괴동 6
삼성동 931
삼정동 19
상대동 391
상서동 230
상소동 3
석교동 133
석봉동 185
선화동 1118
성남동 1213
성북동 1
세천동 14
소제동 106
송강동 579
송정동 1
송촌동 595
신대동 185
신봉동 1
신상동 30
신성동 145
신안동 21
신일동 166
신탄진동 522
신흥동 380
안산동 38
안영동 27
어은동 86
연축동 21
오류동 1416
오정동 2804
옥계동 136
와동 78
외삼동 510
용계동 96
용두동 782
용문동 2254
용산동 149
용운동 259
용전동 2253
용호동 15
우명동 1
원내동 1075
원동 423
원신흥동 372
원촌동 43
월평동 4236
유천동 730
은행동 939
읍내동 506
이현동 2
인동 403
자양동 480
자운동 115
장대동 1535
장동 22
전민동 261
정동 316
정림동 207
주산동 28
주촌동 1
죽동 105
중동 942
중리동 1944
중촌동 477
지족동 638
천동 71
추동 3
추목동 1
탄방동 3681
탑립동 133
태평동 1238
판암동 388
평촌동 93
하기동 93
하소동 4
학하동 50
호동 29
홍도동 363
화암동 371
효동 138
효평동 1
흑석동 7
2018 가수원동 341
가양동 1594
가오동 452
가장동 272
가정동 194
갈마동 5971
갈전동 1
갑동 63
계산동 55
관저동 628
관평동 674
괴곡동 5
괴정동 1037
교촌동 104
구도동 22
구룡동 2
구성동 139
구암동 2407
구완동 1
궁동 1012
금고동 3
낭월동 84
내동 532
노은동 2011
대동 768
대별동 13
대사동 610
대성동 115
대정동 70
대화동 173
대흥동 1358
덕명동 446
덕암동 273
덕진동 30
도룡동 536
도마동 1034
도안동 179
둔곡동 8
둔산동 15336
마산동 1
만년동 461
매노동 2
목동 105
목상동 142
문지동 59
문창동 175
문평동 117
문화동 791
미호동 8
반석동 1209
방동 131
법동 318
변동 461
복수동 373
복용동 135
봉명동 5169
봉산동 82
부사동 916
비래동 484
비룡동 22
사정동 107
산성동 540
삼괴동 18
삼성동 1245
삼정동 18
상대동 348
상서동 155
상소동 5
석교동 113
석봉동 198
선화동 891
성남동 995
성북동 2
세동 2
세천동 5
소제동 185
송강동 670
송정동 2
송촌동 367
신대동 106
신동 1
신상동 11
신성동 118
신안동 19
신일동 145
신탄진동 286
신하동 1
신흥동 449
안산동 19
안영동 42
어은동 83
연축동 6
오동 1
오류동 1512
오정동 2379
옥계동 108
와동 35
외삼동 120
용계동 125
용두동 1093
용문동 1627
용산동 113
용운동 253
용전동 2146
용호동 6
우명동 1
원내동 948
원동 444
원신흥동 427
원촌동 51
월평동 4245
유천동 909
은행동 708
읍내동 408
인동 446
자양동 499
자운동 85
장대동 2403
장동 12
전민동 258
정동 663
정림동 163
정생동 1
주산동 27
주촌동 1
죽동 153
중동 1252
중리동 1643
중촌동 423
지족동 536
천동 87
추동 10
침산동 2
탄방동 3871
탑립동 149
태평동 908
판암동 578
평촌동 65
하기동 158
하소동 1
학하동 118
호동 33
홍도동 397
화암동 301
효동 109
흑석동 7
2019 가수원동 426
가양동 2419
가오동 496
가장동 520
가정동 105
갈마동 6532
갈전동 1
갑동 124
계산동 91
관저동 885
관평동 476
괴곡동 16
괴정동 1488
교촌동 94
구도동 38
구룡동 1
구성동 194
구암동 2188
구완동 1
궁동 1601
금고동 1
낭월동 78
내동 599
노은동 1796
대동 1063
대별동 20
대사동 930
대성동 169
대정동 57
대화동 89
대흥동 1755
덕명동 383
덕암동 219
덕진동 12
도룡동 594
도마동 1305
도안동 441
둔곡동 2
둔산동 14609
만년동 438
매노동 1
목동 138
목상동 207
무수동 1
문지동 58
문창동 170
문평동 122
문화동 1338
미호동 2
반석동 999
방동 210
방현동 21
법동 405
변동 543
복수동 556
복용동 127
봉명동 6403
봉산동 150
부사동 810
비래동 436
비룡동 7
사정동 106
산성동 613
삼괴동 4
삼성동 1378
삼정동 18
상대동 251
상서동 174
상소동 5
석교동 171
석봉동 113
선화동 1086
성남동 1452
성북동 1
세동 5
세천동 7
소제동 342
송강동 607
송정동 5
송촌동 364
신대동 100
신봉동 2
신상동 28
신성동 105
신안동 35
신일동 130
신탄진동 482
신하동 1
신흥동 415
안산동 22
안영동 48
어남동 1
어은동 64
연축동 5
오동 1
오류동 1610
오정동 2116
옥계동 70
와동 43
외삼동 175
용계동 122
용두동 953
용문동 2117
용산동 132
용운동 217
용전동 2691
용호동 6
원내동 862
원동 512
원신흥동 334
원촌동 27
월평동 4567
유천동 981
은행동 1193
읍내동 406
이사동 1
이현동 1
인동 470
자양동 553
자운동 42
장대동 2499
장동 25
전민동 157
정동 460
정림동 176
정생동 2
주산동 19
죽동 167
중동 1381
중리동 1419
중촌동 500
지족동 565
천동 109
추동 7
추목동 1
탄방동 4487
탑립동 120
태평동 1110
판암동 584
평촌동 76
하기동 68
하소동 3
학하동 85
호동 25
홍도동 548
화암동 276
효동 142
효평동 1
흑석동 12
In [114]:
n1 = traffic.groupby(['year','사고'])[['acci_cnt']].count()
In [115]:
n1.reset_index(inplace=True)
In [116]:
n11 = n1.pivot_table(index='사고', columns = 'year', values='acci_cnt')
In [108]:
n11.reset_index(inplace=True)
In [117]:
n11 = n11.T
In [102]:
n11.columns = n11.iloc[0,:]
In [118]:
n11
Out[118]:
사고 차대사람 차대차 차량단독
year
2017 1577 5938 244
2018 1515 5839 198
2019 1595 6476 270
In [ ]:
 
In [18]:
c2c = traffic.loc[traffic['사고']=='차대차'].groupby(['동'])[['acci_cnt']].sum().sort_values(by='acci_cnt',ascending=False)[:100]
c2p = traffic.loc[traffic['사고']=='차대사람'].groupby(['동'])[['acci_cnt']].sum().sort_values(by='acci_cnt',ascending=False)[:100]
c2 = traffic.loc[traffic['사고']=='차량단독'].groupby(['동'])[['acci_cnt']].sum().sort_values(by='acci_cnt',ascending=False)[:100]

a1 = np.intersect1d(np.array(c2c.index),np.array(c2p.index))
a2 = np.intersect1d(np.array(c2c.index),np.array(c2.index))
a3 = np.intersect1d(np.array(c2p.index),np.array(c2.index))
In [19]:
c2c_c2p = pd.merge(c2c, c2p, on='동', how = 'outer')
c2c_c2p_c2 = pd.merge(c2c_c2p, c2, on='동', how = 'outer')
c2c_c2p_c2.columns = ['차대차', '차대사람', '차량단독']
In [21]:
c2c_c2p_c2 = pd.merge(acci_100, c2c_c2p_c2, on='동', how = 'outer') 
In [24]:
c2c_c2p_c2_rank = c2c_c2p_c2.rank(ascending=False)
pd.set_option('display.max_rows', c2c_c2p_c2_rank.shape[0]+1)
c2c_c2p_c2_rank
Out[24]:
acci_cnt 차대차 차대사람 차량단독
둔산동 1.0 1.0 1.0 1.0
갈마동 2.0 2.0 2.0 5.0
봉명동 3.0 3.0 3.0 2.0
월평동 4.0 4.0 5.0 12.0
탄방동 5.0 5.0 4.0 3.0
오정동 6.0 6.0 15.0 23.0
용전동 7.0 9.0 6.0 4.0
구암동 8.0 7.0 26.0 18.0
장대동 9.0 8.0 20.0 16.0
용문동 10.0 10.0 16.0 14.5
가양동 11.0 12.0 12.0 11.0
노은동 12.0 11.0 51.0 47.0
중리동 13.0 13.0 11.0 71.5
대흥동 14.0 15.0 9.0 6.0
오류동 15.0 14.0 17.0 25.0
궁동 16.0 19.0 10.0 9.0
성남동 17.0 18.0 14.0 8.0
도마동 18.0 21.0 13.0 14.5
괴정동 19.0 24.0 8.0 19.0
중동 20.0 20.0 18.0 7.0
삼성동 21.0 17.0 27.0 26.5
태평동 22.0 23.0 22.0 13.0
반석동 23.0 16.0 64.0 52.5
선화동 24.0 22.0 28.0 52.5
문화동 25.0 27.0 19.0 10.0
원내동 26.0 26.0 30.0 28.0
은행동 27.0 33.0 7.0 21.0
용두동 28.0 25.0 35.0 52.5
부사동 29.0 28.0 23.0 65.0
유천동 30.0 29.0 21.0 49.5
대동 31.0 30.0 25.0 17.0
대사동 32.0 31.0 32.0 41.0
관저동 33.0 32.0 31.0 40.0
송강동 34.0 35.0 44.0 94.0
도룡동 35.0 34.0 73.0 35.0
산성동 36.0 41.0 29.0 32.5
관평동 37.0 37.0 52.0 31.0
지족동 38.0 38.0 49.0 22.0
내동 39.0 40.0 43.0 29.5
변동 40.0 39.0 47.0 32.5
만년동 41.0 36.0 71.0 49.5
판암동 42.0 44.0 33.0 42.0
자양동 43.0 46.0 36.0 34.0
비래동 44.0 47.0 42.0 39.0
정동 45.0 62.0 24.0 26.5
복수동 46.0 45.0 46.0 37.5
중촌동 47.0 52.0 41.0 29.5
가오동 48.0 48.0 50.0 44.5
원동 49.0 55.0 40.0 20.0
송촌동 50.0 56.0 37.0 59.0
읍내동 51.0 43.0 63.0 63.0
인동 52.0 49.0 54.0 57.0
홍도동 53.0 57.0 39.0 37.5
덕명동 54.0 42.0 81.5 99.5
신탄진동 55.0 58.0 34.0 52.5
가수원동 56.0 50.0 55.0 44.5
신흥동 57.0 51.0 58.5 36.0
가장동 58.0 53.0 56.0 43.0
법동 59.0 59.0 38.0 76.5
원신흥동 60.0 54.0 66.0 55.5
상대동 61.0 61.0 67.0 58.0
화암동 62.0 60.0 79.0 60.5
도안동 63.0 64.0 57.0 47.0
외삼동 64.0 63.0 75.5 NaN
덕암동 65.0 65.0 53.0 NaN
용운동 66.0 69.0 48.0 60.5
전민동 67.0 73.0 45.0 74.0
목상동 68.0 67.0 58.5 NaN
소제동 69.0 68.0 61.0 88.0
문창동 70.0 74.0 62.0 24.0
상서동 71.0 66.0 92.5 82.0
정림동 72.0 72.0 68.0 47.0
석봉동 73.0 82.0 60.0 NaN
방동 74.0 70.0 NaN 69.5
대성동 75.5 78.5 73.0 84.0
구성동 75.5 71.0 NaN 79.5
신일동 77.0 80.0 75.5 79.5
대화동 78.0 81.0 73.0 94.0
봉산동 79.0 75.0 86.0 76.5
죽동 80.0 77.0 80.0 NaN
석교동 81.0 84.0 83.0 55.5
탑립동 82.0 78.5 94.5 NaN
용산동 83.0 76.0 NaN NaN
신대동 84.0 83.0 88.0 NaN
목동 86.0 94.0 65.0 64.0
효동 86.0 87.0 77.0 67.5
문평동 86.0 85.0 78.0 NaN
신성동 88.0 93.0 69.5 73.0
용계동 89.0 86.0 NaN NaN
복용동 90.0 88.0 96.0 NaN
하기동 91.0 91.0 97.5 76.5
계산동 92.0 90.0 97.5 NaN
옥계동 93.0 98.0 69.5 66.0
가정동 94.0 89.0 NaN NaN
갑동 95.0 92.0 NaN 82.0
사정동 96.0 95.0 89.5 71.5
천동 97.0 99.0 81.5 69.5
학하동 98.0 NaN 84.0 62.0
자운동 99.0 96.5 NaN 67.5
평촌동 100.0 96.5 NaN NaN
교촌동 NaN 100.0 94.5 82.0
어은동 NaN NaN 85.0 NaN
낭월동 NaN NaN 87.0 86.0
와동 NaN NaN 89.5 NaN
안영동 NaN NaN 91.0 86.0
호동 NaN NaN 92.5 NaN
대정동 NaN NaN 99.0 NaN
덕진동 NaN NaN 100.0 NaN
안산동 NaN NaN NaN 76.5
대별동 NaN NaN NaN 86.0
괴곡동 NaN NaN NaN 90.0
연축동 NaN NaN NaN 90.0
둔곡동 NaN NaN NaN 90.0
원촌동 NaN NaN NaN 94.0
신상동 NaN NaN NaN 94.0
삼정동 NaN NaN NaN 94.0
삼괴동 NaN NaN NaN 97.5
구도동 NaN NaN NaN 97.5
성북동 NaN NaN NaN 99.5
In [ ]:
 
In [36]:
# 격자 데이터
data_gid = 교통사고격자[['gid', 'geometry']]

격자별 COUNT

차량등록현황

In [53]:
차량등록현황.head()
Out[53]:
gid cars_cnt geometry
0 다마846996 0 MULTIPOLYGON (((127.32871 36.19342, 127.32871 ...
1 다마847995 0 MULTIPOLYGON (((127.32983 36.19252, 127.32982 ...
2 다마847996 0 MULTIPOLYGON (((127.32982 36.19342, 127.32982 ...
3 다마847997 0 MULTIPOLYGON (((127.32982 36.19432, 127.32982 ...
4 다마847998 0 MULTIPOLYGON (((127.32982 36.19522, 127.32982 ...
In [54]:
차량등록현황 = 차량등록현황[['gid', 'cars_cnt']]

인구정보_총인구

In [81]:
인구정보_총인구.head()
Out[81]:
gid val geometry
0 다마846996 NaN MULTIPOLYGON (((127.32871 36.19342, 127.32871 ...
1 다마847995 NaN MULTIPOLYGON (((127.32983 36.19252, 127.32982 ...
2 다마847996 NaN MULTIPOLYGON (((127.32982 36.19342, 127.32982 ...
3 다마847997 NaN MULTIPOLYGON (((127.32982 36.19432, 127.32982 ...
4 다마847998 NaN MULTIPOLYGON (((127.32982 36.19522, 127.32982 ...
In [82]:
인구정보_총인구 = 인구정보_총인구.rename({'val':'pop_cnt'},axis=1)
인구정보_총인구 = 인구정보_총인구[['gid', 'pop_cnt']]

인구정보_고령

In [57]:
인구정보_고령.head()
Out[57]:
gid val geometry
0 다마846996 NaN MULTIPOLYGON (((127.32871 36.19342, 127.32871 ...
1 다마847995 NaN MULTIPOLYGON (((127.32983 36.19252, 127.32982 ...
2 다마847996 NaN MULTIPOLYGON (((127.32982 36.19342, 127.32982 ...
3 다마847997 NaN MULTIPOLYGON (((127.32982 36.19432, 127.32982 ...
4 다마847998 NaN MULTIPOLYGON (((127.32982 36.19522, 127.32982 ...
In [83]:
인구정보_고령 = 인구정보_고령.rename({'val':'pop_old_cnt'},axis=1)
인구정보_고령 = 인구정보_고령[['gid', 'pop_old_cnt']]

인구정보_생산가능

In [59]:
인구정보_생산가능.head()
Out[59]:
gid val geometry
0 다마846996 NaN MULTIPOLYGON (((127.32871 36.19342, 127.32871 ...
1 다마847995 NaN MULTIPOLYGON (((127.32983 36.19252, 127.32982 ...
2 다마847996 NaN MULTIPOLYGON (((127.32982 36.19342, 127.32982 ...
3 다마847997 NaN MULTIPOLYGON (((127.32982 36.19432, 127.32982 ...
4 다마847998 NaN MULTIPOLYGON (((127.32982 36.19522, 127.32982 ...
In [84]:
인구정보_생산가능 = 인구정보_생산가능.rename({'val':'pop_mid_cnt'},axis=1)
인구정보_생산가능 = 인구정보_생산가능[['gid', 'pop_mid_cnt']]

인구정보_유소년

In [61]:
인구정보_유소년.head()
Out[61]:
gid val geometry
0 다마846996 NaN MULTIPOLYGON (((127.32871 36.19342, 127.32871 ...
1 다마847995 NaN MULTIPOLYGON (((127.32983 36.19252, 127.32982 ...
2 다마847996 NaN MULTIPOLYGON (((127.32982 36.19342, 127.32982 ...
3 다마847997 NaN MULTIPOLYGON (((127.32982 36.19432, 127.32982 ...
4 다마847998 NaN MULTIPOLYGON (((127.32982 36.19522, 127.32982 ...
In [85]:
인구정보_유소년 = 인구정보_유소년.rename({'val':'pop_young_cnt'},axis=1)
인구정보_유소년 = 인구정보_유소년[['gid', 'pop_young_cnt']]
In [ ]:
 

신호등_보행등

In [56]:
신호등_보행등 = gpd.read_file("3.대전광역시_신호등(보행등).geojson")
In [80]:
신호등_보행등.head()
Out[80]:
gu dong jibun loc_cd sgnl_drn_cd sgnl_knd_cd geometry
0 서구 관저동 None 1 None 2 POINT (127.33462 36.29501)
1 유성구 노은동 None 1 None 2 POINT (127.32352 36.36703)
2 동구 판암동 None 1 None 2 POINT (127.46137 36.32029)
3 동구 판암동 None 1 None 2 POINT (127.45688 36.31913)
4 동구 판암동 None 1 None 2 POINT (127.45670 36.31918)
In [50]:
gid_list = []
for i in tqdm(range(신호등_보행등.shape[0])):
    point = 신호등_보행등['geometry'].iloc[i]
    if data_gid['geometry'].contains(point).sum() == 0:
        g1 = "Na"
    else :
        g = data_gid['gid'].loc[data_gid['geometry'].contains(point)]
        g1 = g.iloc[0]
    gid_list.append(g1)
신호등_보행등['gid'] = gid_list
100%|██████████| 7407/7407 [1:07:20<00:00,  1.83it/s]
In [58]:
신호등_보행등['gid'] = gid_list
In [59]:
신호등_보행등['PTL_cnt']=1
result_cnt = 신호등_보행등.groupby(['gid']).sum()
result_cnt.reset_index(inplace=True)
신호등_보행등 = result_cnt
신호등_보행등 = 신호등_보행등[['gid', 'PTL_cnt']]
In [52]:
신호등_보행등.to_csv('신호등_보행등.csv')
In [ ]:
 

신호등_차량등

In [94]:
신호등_차량등.head()
Out[94]:
gu dong jibun loc_cd sgnl_drn_cd sgnl_knd_cd geometry
0 유성구 구암동 None 1 2 1 POINT (127.32922 36.34867)
1 유성구 구암동 None 1 2 1 POINT (127.32922 36.34862)
2 유성구 구암동 None 1 2 1 POINT (127.32939 36.34836)
3 동구 삼정동 11-17전 1 2 1 POINT (127.47768 36.33256)
4 유성구 구암동 None 1 2 1 POINT (127.32955 36.34862)
In [13]:
gid_list = []
for i in tqdm(range(신호등_차량등.shape[0])):
    point = 신호등_차량등['geometry'].iloc[i]
    if data_gid['geometry'].contains(point).sum() == 0:
        g1 = "Na"
    else :
        g = data_gid['gid'].loc[data_gid['geometry'].contains(point)]
        g1 = g.iloc[0]
    gid_list.append(g1)
신호등_차량등['gid'] = gid_list
100%|██████████| 11998/11998 [1:46:53<00:00,  1.87it/s]
In [14]:
신호등_차량등['CTL_cnt']=1
result_cnt = 신호등_차량등.groupby(['gid']).sum()
result_cnt.reset_index(inplace=True)
신호등_차량등 = result_cnt
신호등_차량등 = 신호등_차량등[['gid', 'CTL_cnt']]
In [15]:
신호등_차량등.to_csv('신호등_차량등.csv')
In [ ]:
 

안전지대

In [14]:
gid_list = []
for i in tqdm(range(안전지대.shape[0])):
    point = 안전지대['geometry'].iloc[i]
    if data_gid['geometry'].contains(point).sum() == 0:
        g1 = "Na"
    else :
        g = data_gid['gid'].loc[data_gid['geometry'].contains(point)]
        g1 = g.iloc[0]
    gid_list.append(g1)
안전지대['gid'] = gid_list
100%|██████████| 3026/3026 [00:59<00:00, 50.67it/s]
In [15]:
안전지대['SafeZone_cnt']=1
result_cnt = 안전지대.groupby(['gid']).sum()
result_cnt.reset_index(inplace=True)
안전지대 = result_cnt
안전지대 = 안전지대[['gid', 'SafeZone_cnt']]
In [16]:
안전지대.to_csv('안전지대.csv')
In [ ]:
 
In [ ]:
횡단보도 
In [17]:
횡단보도.head()
Out[17]:
gu dong jibun loc_cd crsw_gbn_cd crsw_knd_cd hol_len vel_len geometry
0 중구 문화동 None 1 1 1 6.0 26.0 MULTIPOLYGON (((127.40803 36.31549, 127.40801 ...
1 중구 유천동 None 1 1 1 4.0 11.0 MULTIPOLYGON (((127.39799 36.31250, 127.39787 ...
2 None None None 1 2 1 4.0 5.0 MULTIPOLYGON (((127.43430 36.33902, 127.43423 ...
3 None None None 1 2 1 6.0 7.0 MULTIPOLYGON (((127.43651 36.33524, 127.43651 ...
4 동구 삼성동 None 1 1 1 8.0 21.0 MULTIPOLYGON (((127.42324 36.34282, 127.42307 ...
In [18]:
gid_list = []
for i in tqdm(range(횡단보도.shape[0])):
    point = 횡단보도['geometry'].iloc[i]
    if data_gid['geometry'].contains(point).sum() == 0:
        g1 = "Na"
    else :
        g = data_gid['gid'].loc[data_gid['geometry'].contains(point)]
        g1 = g.iloc[0]
    gid_list.append(g1)
횡단보도['gid'] = gid_list
100%|██████████| 12589/12589 [04:23<00:00, 47.81it/s]
In [19]:
횡단보도['Pedcrossing_cnt']=1
result_cnt = 횡단보도.groupby(['gid']).sum()
result_cnt.reset_index(inplace=True)
횡단보도 = result_cnt
횡단보도 = 횡단보도[['gid', 'Pedcrossing_cnt']]
In [20]:
횡단보도.to_csv('횡단보도.csv')
In [ ]:
 

도로속도표시

In [41]:
도로속도표시 = gpd.read_file("7.대전광역시_도로속도표시.geojson")
In [15]:
도로속도표시.head()
Out[15]:
gu dong jibun char_ctt geometry
0 서구 도안동 None 30 POINT (127.34400 36.32066)
1 유성구 원신흥동 None 30 POINT (127.34082 36.33462)
2 서구 둔산동 None 30 POINT (127.39448 36.35359)
3 대덕구 읍내동 None 50 POINT (127.38685 36.35398)
4 대덕구 오정동 None 30 POINT (127.41365 36.35662)
In [27]:
gid_list = []
for i in tqdm(range(도로속도표시.shape[0])):
    point = 도로속도표시['geometry'].iloc[i]
    if data_gid['geometry'].contains(point).sum() == 0:
        g1 = "NA"
    else :
        g = data_gid['gid'].loc[data_gid['geometry'].contains(point)]
        g1 = g.iloc[0]
    gid_list.append(g1)
도로속도표시['gid'] = gid_list
100%|██████████| 6799/6799 [55:55<00:00,  2.03it/s]
In [43]:
도로속도표시['speed_cnt']=1
result_cnt = 도로속도표시.groupby(['gid']).sum()
result_cnt.reset_index(inplace=True)
도로속도표시 = result_cnt
도로속도표시 = 도로속도표시[['gid', 'speed_cnt']]
In [48]:
도로속도표시.to_csv('도로속도표시.csv')
In [50]:
도로속도표시
Out[50]:
gid speed_cnt
0 NA 1
1 다바780091 2
2 다바787129 2
3 다바787135 2
4 다바788087 2
... ... ...
2828 라바027219 2
2829 라바031226 1
2830 라바033232 2
2831 라바034240 2
2832 라바034241 1

2833 rows × 2 columns

In [ ]:
 

정차금지지대

In [49]:
정차금지지대.head()
Out[49]:
gu dong jibun loc_cd len geometry
0 대덕구 오정동 None 1 80.0 MULTIPOLYGON (((127.41606 36.34810, 127.41609 ...
1 대덕구 오정동 715도 1 0.0 MULTIPOLYGON (((127.40957 36.35338, 127.40952 ...
2 대덕구 오정동 726도 1 0.0 MULTIPOLYGON (((127.41012 36.35291, 127.41010 ...
3 대덕구 오정동 731도 1 0.0 MULTIPOLYGON (((127.41558 36.34856, 127.41553 ...
4 동구 삼성동 458도 1 0.0 MULTIPOLYGON (((127.42394 36.34216, 127.42391 ...
In [14]:
gid_list = []
for i in tqdm(range(정차금지지대.shape[0])):
    point = 정차금지지대['geometry'].iloc[i]
    if data_gid['geometry'].contains(point).sum() == 0:
        g1 = "NA"
    else :
        g = data_gid['gid'].loc[data_gid['geometry'].contains(point)]
        g1 = g.iloc[0]
    gid_list.append(g1)
정차금지지대['gid'] = gid_list
100%|██████████| 46/46 [00:21<00:00,  2.10it/s]
In [15]:
정차금지지대['nostop_cnt']=1
result_cnt = 정차금지지대.groupby(['gid']).sum()
result_cnt.reset_index(inplace=True)
정차금지지대 = result_cnt
정차금지지대 = 정차금지지대[['gid', 'nostop_cnt']]
In [16]:
정차금지지대.head()
Out[16]:
gid nostop_cnt
0 NA 15
1 다바838211 1
2 다바849150 1
3 다바866123 1
4 다바867124 3
In [17]:
정차금지지대.to_csv('정차금지지대.csv')
In [ ]:
 

교통안전표지

In [17]:
교통안전표지.head()
Out[17]:
gu dong jibun loc_cd sign_met_cd sign_knd_cd_f sign_knd_cd_s sign_knd_cd_t sign_ctt_f sign_ctt_s sign_ctt_t sign_atc_loc_cd geometry
0 서구 관저동 None 1 3 2 None None None None None None POINT (127.32113 36.29368)
1 유성구 원내동 None 1 3 2 None None None None None None POINT (127.32049 36.29342)
2 서구 괴정동 None 1 3 3 None None None None None None POINT (127.38909 36.34050)
3 서구 관저동 None 1 3 1 4 None None None None None POINT (127.31586 36.28560)
4 유성구 송정동 None 1 3 2 4 None 70 200m앞부터 None None POINT (127.25583 36.27995)
In [13]:
gid_list = []
for i in tqdm(range(교통안전표지.shape[0])):
    point = 교통안전표지['geometry'].iloc[i]
    if data_gid['geometry'].contains(point).sum() == 0:
        g1 = "NA"
    else :
        g = data_gid['gid'].loc[data_gid['geometry'].contains(point)]
        g1 = g.iloc[0]
    gid_list.append(g1)
교통안전표지['gid'] = gid_list
100%|██████████| 37606/37606 [12:43<00:00, 49.23it/s]
In [14]:
교통안전표지['safteysign_cnt']=1
result_cnt = 교통안전표지.groupby(['gid']).sum()
result_cnt.reset_index(inplace=True)
교통안전표지 = result_cnt
교통안전표지 = 교통안전표지[['gid', 'safteysign_cnt']]
In [15]:
교통안전표지.to_csv('교통안전표지.csv')
In [ ]:
 

교통CCTV

In [18]:
교통CCTV.head()
Out[18]:
gu dong jibun geometry
0 대덕구 오정동 None POINT (127.41523 36.35876)
1 대덕구 오정동 None POINT (127.41524 36.35877)
2 서구 탄방동 None POINT (127.40185 36.34503)
3 동구 가양동 None POINT (127.44235 36.35098)
4 서구 용문동 None POINT (127.39326 36.33812)
In [19]:
gid_list = []
for i in tqdm(range(교통CCTV.shape[0])):
    point = 교통CCTV['geometry'].iloc[i]
    if data_gid['geometry'].contains(point).sum() == 0:
        g1 = "NA"
    else :
        g = data_gid['gid'].loc[data_gid['geometry'].contains(point)]
        g1 = g.iloc[0]
    gid_list.append(g1)
교통CCTV['gid'] = gid_list
100%|██████████| 132/132 [01:12<00:00,  1.83it/s]
In [20]:
교통CCTV['cctv_cnt']=1
result_cnt = 교통CCTV.groupby(['gid']).sum()
result_cnt.reset_index(inplace=True)
교통CCTV = result_cnt
교통CCTV = 교통CCTV[['gid', 'cctv_cnt']]
In [38]:
교통CCTV.head()
Out[38]:
gu dong jibun geometry
0 대덕구 오정동 None POINT (127.41523 36.35876)
1 대덕구 오정동 None POINT (127.41524 36.35877)
2 서구 탄방동 None POINT (127.40185 36.34503)
3 동구 가양동 None POINT (127.44235 36.35098)
4 서구 용문동 None POINT (127.39326 36.33812)
In [22]:
교통CCTV.to_csv('교통CCTV.csv')
In [ ]:
 

중앙분리대

In [28]:
중앙분리대 = gpd.read_file("31.대전시_중앙분리대.geojson")
In [29]:
중앙분리대.head()
Out[29]:
byc_len byc_wid std_hit geometry
0 9.03 0.1 1.0 MULTIPOLYGON (((127.35022 36.33998, 127.35022 ...
1 18.13 0.1 1.0 MULTIPOLYGON (((127.34994 36.31754, 127.34994 ...
2 33.84 0.1 1.0 MULTIPOLYGON (((127.34853 36.31767, 127.34853 ...
3 33.84 0.1 1.0 MULTIPOLYGON (((127.34931 36.31778, 127.34931 ...
4 33.85 0.1 1.0 MULTIPOLYGON (((127.35010 36.31790, 127.35010 ...
In [33]:
gid_list = []
for i in tqdm(range(중앙분리대.shape[0])):
    point = 중앙분리대['geometry'].iloc[i]
    if data_gid['geometry'].contains(point).sum() == 0:
        g1 = "NA"
    else :
        g = data_gid['gid'].loc[data_gid['geometry'].contains(point)]
        g1 = g.iloc[0]
    gid_list.append(g1)
중앙분리대['gid'] = gid_list
100%|██████████| 16/16 [00:06<00:00,  2.41it/s]
In [34]:
중앙분리대['medianstrip_cnt']=1
result_cnt = 중앙분리대.groupby(['gid']).sum()
result_cnt.reset_index(inplace=True)
중앙분리대 = result_cnt
중앙분리대 = 중앙분리대[['gid', 'medianstrip_cnt']]
In [35]:
중앙분리대.to_csv('중앙분리대.csv')
In [36]:
중앙분리대.head()
Out[36]:
gid medianstrip_cnt
0 NA 8
1 다바864133 1
2 다바865133 1
3 다바865134 1
4 다바865142 1

차량등록현황

In [23]:
차량등록현황.head()
Out[23]:
gid cars_cnt geometry
0 다마846996 0 MULTIPOLYGON (((127.32871 36.19342, 127.32871 ...
1 다마847995 0 MULTIPOLYGON (((127.32983 36.19252, 127.32982 ...
2 다마847996 0 MULTIPOLYGON (((127.32982 36.19342, 127.32982 ...
3 다마847997 0 MULTIPOLYGON (((127.32982 36.19432, 127.32982 ...
4 다마847998 0 MULTIPOLYGON (((127.32982 36.19522, 127.32982 ...
In [24]:
차량등록현황 = 차량등록현황[['gid', 'cars_cnt']]
In [25]:
차량등록현황.to_csv('차량등록현황.csv')
In [ ]:
 

도로명주소_건물

In [6]:
도로명주소_건물.head()
Out[6]:
BDTYP_CD BULD_NM BULD_NM_DC BULD_SE_CD BUL_MAN_NO EMD_CD GRO_FLO_CO LNBR_MNNM LNBR_SLNO UND_FLO_CO geometry
0 04402 한국도로공사남대전IC None 0 17084 142 1 51 0 0 MULTIPOLYGON (((127.47634 36.26865, 127.47627 ...
1 04402 None None 0 39055 108 1 198 0 0 MULTIPOLYGON (((127.46771 36.31839, 127.46838 ...
2 04402 None None 0 16443 118 4 331 6 1 MULTIPOLYGON (((127.41917 36.33933, 127.41911 ...
3 03001 None None 0 16442 118 3 331 5 0 MULTIPOLYGON (((127.41924 36.33938, 127.41919 ...
4 10204 None None 0 16441 118 5 331 4 1 MULTIPOLYGON (((127.41939 36.33951, 127.41926 ...
In [21]:
# 격자별로 포함하는 건물(전체 / 주거용 / 시무용) 개수 측정

df1 = 도로명주소_건물.copy()

df2 = df1.loc[:, ['BDTYP_CD','geometry']]
df2['BDTYP_CD'] = [int(x[0:3]) for x in df2.BDTYP_CD]      # 건물 용도별로 구분하기 위해 구분열 지정
df2['geometry'] = df2.geometry.centroid                     # 건물의 중심점으로 geometry 다시 지정

bld = []        # bid는 격자 안에 있는 총 건물의 개수
house = []      # house는 격자 안에 있는 주거용 건물의 개수
office = []     # office는 격자 안에 있는 사무용 건물의 개수
/opt/app-root/lib/python3.6/site-packages/ipykernel_launcher.py:7: UserWarning: Geometry is in a geographic CRS. Results from 'centroid' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.

  import sys
In [24]:
# bid 만들기

temp1 = data_gid.copy()
temp1 = temp1.loc[:, ['gid', 'geometry']]

df3 = df2.copy()

for i in tqdm(range(len(temp1))):
    bld.append(sum(df3.geometry.intersects(temp1.geometry[i])))
100%|██████████| 54912/54912 [35:57<00:00, 25.45it/s] 
In [25]:
# house 만들기

df3 = df2.copy()
df3 = df3.loc[(df3['BDTYP_CD']<30),:]      # 주거용 건물(건물 용도 번호 앞 세 자리가 30 이하)만 남김

for i in tqdm(range(len(temp1))):
    house.append(sum(df3.geometry.intersects(temp1.geometry[i])))
100%|██████████| 54912/54912 [26:22<00:00, 34.70it/s] 
In [26]:
# office 만들기

df3 = df2.copy()
df3 = df3.loc[(df3['BDTYP_CD']==44)|(df3['BDTYP_CD']==100)|(df3['BDTYP_CD']==101)|(df3['BDTYP_CD']==102), :]    # 사무용 건물에 해당하는 건물 용도 번호만 남김

for i in tqdm(range(len(temp1))):
    office.append(sum(df3.geometry.intersects(temp1.geometry[i])))
100%|██████████| 54912/54912 [01:45<00:00, 518.55it/s]
In [27]:
# buildings는 기준 데이터와 병합할 데이터

temp1['building'] = bld
temp1['house'] = house
temp1['office'] = office

buildings = temp1.loc[:, ['gid', 'building', 'house', 'office']]
In [28]:
buildings.to_csv('도로명주소_건물.csv')
In [10]:
도로명주소_건물.head()
Out[10]:
BDTYP_CD BULD_NM BULD_NM_DC BULD_SE_CD BUL_MAN_NO EMD_CD GRO_FLO_CO LNBR_MNNM LNBR_SLNO UND_FLO_CO geometry
0 04402 한국도로공사남대전IC None 0 17084 142 1 51 0 0 MULTIPOLYGON (((127.47634 36.26865, 127.47627 ...
1 04402 None None 0 39055 108 1 198 0 0 MULTIPOLYGON (((127.46771 36.31839, 127.46838 ...
2 04402 None None 0 16443 118 4 331 6 1 MULTIPOLYGON (((127.41917 36.33933, 127.41911 ...
3 03001 None None 0 16442 118 3 331 5 0 MULTIPOLYGON (((127.41924 36.33938, 127.41919 ...
4 10204 None None 0 16441 118 5 331 4 1 MULTIPOLYGON (((127.41939 36.33951, 127.41926 ...
In [ ]:
 
In [25]:
교통안전표지 = gpd.read_file("9.대전광역시_교통안전표지.geojson")
In [26]:
교통안전표지.head()
Out[26]:
gu dong jibun loc_cd sign_met_cd sign_knd_cd_f sign_knd_cd_s sign_knd_cd_t sign_ctt_f sign_ctt_s sign_ctt_t sign_atc_loc_cd geometry
0 서구 관저동 None 1 3 2 None None None None None None POINT (127.32113 36.29368)
1 유성구 원내동 None 1 3 2 None None None None None None POINT (127.32049 36.29342)
2 서구 괴정동 None 1 3 3 None None None None None None POINT (127.38909 36.34050)
3 서구 관저동 None 1 3 1 4 None None None None None POINT (127.31586 36.28560)
4 유성구 송정동 None 1 3 2 4 None 70 200m앞부터 None None POINT (127.25583 36.27995)
In [14]:
b2 = pd.read_excel('29.코드정의서.xlsx')
b2.head()
Out[14]:
Unnamed: 0 Unnamed: 1
0 NaN NaN
1 광역도로 구분코드(WDR_RD_CD) NaN
2 코드 코드명
3 1 행자부도로
4 2 광역도로
In [20]:
building_info = pd.merge(도로명주소_건물, b2, left_on='BDTYP_CD',right_on='Unnamed: 0', how='left')[['BDTYP_CD','Unnamed: 1','geometry']]
In [21]:
join = gpd.sjoin(교통사고격자, building_info, how="inner", op="contains")
In [22]:
join
Out[22]:
gid acci_cnt geometry index_right BDTYP_CD Unnamed: 1
0 다바866110 0 MULTIPOLYGON (((127.35076 36.29622, 127.35076 ... 172934 01001 단독주택
0 다바866110 0 MULTIPOLYGON (((127.35076 36.29622, 127.35076 ... 172935 01001 단독주택
0 다바866110 0 MULTIPOLYGON (((127.35076 36.29622, 127.35076 ... 172937 01001 단독주택
0 다바866110 0 MULTIPOLYGON (((127.35076 36.29622, 127.35076 ... 172936 01001 단독주택
0 다바866110 0 MULTIPOLYGON (((127.35076 36.29622, 127.35076 ... 172932 01001 단독주택
... ... ... ... ... ... ...
54690 다바822172 0 MULTIPOLYGON (((127.30162 36.35205, 127.30161 ... 193687 08104 대학교
54783 다바949037 0 MULTIPOLYGON (((127.44325 36.23049, 127.44325 ... 45503 14001 창고
54864 다바792108 0 MULTIPOLYGON (((127.26835 36.29429, 127.26835 ... 212880 05106 수녀원
54864 다바792108 0 MULTIPOLYGON (((127.26835 36.29429, 127.26835 ... 212879 05106 비디오물소극장
54901 다바903223 0 MULTIPOLYGON (((127.39183 36.39814, 127.39183 ... 194803 08104 대학교

205791 rows × 6 columns

In [27]:
pd.read_csv('16.대전광역시_기상데이터(2017~2019).csv')
Out[27]:
일시 평균기온(°C) 최저기온(°C) 최고기온(°C) 일강수량(mm) 최대 풍속(m/s) 최대 풍속 풍향(16방위) 평균 풍속(m/s) 평균 상대습도(%) 일 최심적설(cm) 평균 지면온도(°C) 안개 계속시간(hr)
0 2017-01-01 3.5 -1.3 10.7 NaN 3.1 180 0.7 81.5 NaN 3.3 NaN
1 2017-01-02 4.7 -0.4 10.8 NaN 5.2 180 1.5 83.0 NaN 3.4 NaN
2 2017-01-03 3.3 -1.5 9.2 NaN 3.9 180 1.4 77.1 NaN 3.0 NaN
3 2017-01-04 4.2 -0.2 10.7 NaN 2.4 320 1.0 70.5 NaN 3.1 NaN
4 2017-01-05 4.3 -0.7 9.3 NaN 5.6 110 1.9 71.3 NaN 2.9 NaN
... ... ... ... ... ... ... ... ... ... ... ... ...
1090 2019-12-27 0.1 -3.1 5.2 NaN 3.5 250 1.3 62.8 NaN 1.6 NaN
1091 2019-12-28 0.6 -5.0 8.2 NaN 1.9 50 0.8 64.3 NaN 1.1 NaN
1092 2019-12-29 2.0 -2.3 6.3 7.0 4.0 70 1.1 76.6 NaN 1.6 NaN
1093 2019-12-30 4.2 -0.4 9.4 1.5 5.8 270 1.5 86.9 NaN 4.2 1.67
1094 2019-12-31 -4.7 -7.5 -0.4 0.0 4.9 250 2.5 55.0 NaN -0.4 NaN

1095 rows × 12 columns

In [ ]:
 
In [ ]:
 
In [ ]:
 

안전시설물 데이터셋

In [33]:
df1 = pd.read_csv('차량등록현황.csv')
df2 = pd.read_csv('교통CCTV.csv')
df3 = pd.read_csv('교통안전표지.csv')
df4 = pd.read_csv('도로속도표시.csv')
df5 = pd.read_csv('신호등_보행등.csv')
df6 = pd.read_csv('신호등_차량등.csv')
df7 = pd.read_csv('안전지대.csv')
df8 = pd.read_csv('정차금지지대.csv')
df9 = pd.read_csv('중앙분리대.csv')
df10 = pd.read_csv('횡단보도.csv')
In [74]:
df1 = df1[['gid','cars_cnt']]
df2 = df2[['gid','cctv_cnt']]
df3 = df3[['gid','safteysign_cnt']]
df4 = df4[['gid','speed_cnt']]
df5 = df5[['gid','PTL_cnt']]
df6 = df6[['gid','CTL_cnt']]
df7 = df7[['gid','SafeZone_cnt']]
df8 = df8[['gid','nostop_cnt']]
df9 = df9[['gid','medianstrip_cnt']]
df10 = df10[['gid','Pedcrossing_cnt']]
In [136]:
f1 = pd.merge(df1, df2, on ='gid', how = 'outer')
f1 = pd.merge(f1, df3, on ='gid', how = 'outer')
f1 = pd.merge(f1, df4, on ='gid', how = 'outer')
f1 = pd.merge(f1, df5, on ='gid', how = 'outer')
f1 = pd.merge(f1, df6, on ='gid', how = 'outer')
f1 = pd.merge(f1, df7, on ='gid', how = 'outer')
f1 = pd.merge(f1, df8, on ='gid', how = 'outer')
f1 = pd.merge(f1, df9, on ='gid', how = 'outer')
f1 = pd.merge(f1, df10, on ='gid', how = 'outer')
In [148]:
final_df = f1
In [ ]:
 
In [149]:
# 결측값 0으로 채우기 
final_na = f1[f1['gid'] != "Na"]
final_df = final_na.fillna(0)
In [150]:
final_df.head()
Out[150]:
gid cars_cnt cctv_cnt safteysign_cnt speed_cnt PTL_cnt CTL_cnt SafeZone_cnt nostop_cnt medianstrip_cnt Pedcrossing_cnt
0 다마846996 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
1 다마847995 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
2 다마847996 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
3 다마847997 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
4 다마847998 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
In [151]:
# csv 파일 저장 
final_df.to_csv('final_data.csv', encoding='utf-8-sig',index=False)
In [152]:
# 격자 데이터 저장 
data_gid.to_file('gid_data.geojson', driver= 'GeoJSON')
In [153]:
# geojson 파일로 저장
data_final = pd.merge(final_df, data_gid, on = 'gid', how = 'left')
data_final = gpd.GeoDataFrame(data_final, geometry='geometry')
data_final.head()
Out[153]:
gid cars_cnt cctv_cnt safteysign_cnt speed_cnt PTL_cnt CTL_cnt SafeZone_cnt nostop_cnt medianstrip_cnt Pedcrossing_cnt geometry
0 다마846996 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 MULTIPOLYGON (((127.32871 36.19342, 127.32871 ...
1 다마847995 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 MULTIPOLYGON (((127.32983 36.19252, 127.32982 ...
2 다마847996 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 MULTIPOLYGON (((127.32982 36.19342, 127.32982 ...
3 다마847997 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 MULTIPOLYGON (((127.32982 36.19432, 127.32982 ...
4 다마847998 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 MULTIPOLYGON (((127.32982 36.19522, 127.32982 ...
In [154]:
data_final.to_file('final_dataset.geojson', driver="GeoJSON",index=False)
In [52]:
data_final = gpd.read_file('final_dataset.geojson')
In [77]:
data_final.sort_values(by='CTL_cnt', ascending=False)
Out[77]:
gid cars_cnt cctv_cnt safteysign_cnt speed_cnt PTL_cnt CTL_cnt SafeZone_cnt nostop_cnt medianstrip_cnt Pedcrossing_cnt geometry
26732 다바903198 154.0 0.0 6.0 0.0 2.0 20.0 0.0 0.0 0.0 3.0 MULTIPOLYGON (((127.39186 36.37560, 127.39186 ...
39003 다바947139 6.0 0.0 18.0 1.0 8.0 17.0 2.0 1.0 0.0 6.0 MULTIPOLYGON (((127.44095 36.32245, 127.44095 ...
10521 다바841188 0.0 0.0 26.0 0.0 2.0 16.0 3.0 0.0 0.0 4.0 MULTIPOLYGON (((127.32276 36.36650, 127.32276 ...
39575 다바949144 0.0 0.0 27.0 1.0 6.0 16.0 0.0 0.0 0.0 3.0 MULTIPOLYGON (((127.44318 36.32695, 127.44318 ...
36748 다바939179 0.0 2.0 24.0 0.0 6.0 16.0 0.0 0.0 0.0 4.0 MULTIPOLYGON (((127.43201 36.35850, 127.43201 ...
... ... ... ... ... ... ... ... ... ... ... ... ...
18505 다바872106 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 MULTIPOLYGON (((127.35745 36.29262, 127.35745 ...
18506 다바872107 0.0 0.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 MULTIPOLYGON (((127.35745 36.29353, 127.35745 ...
18507 다바872108 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 MULTIPOLYGON (((127.35745 36.29443, 127.35745 ...
18508 다바872109 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 MULTIPOLYGON (((127.35745 36.29533, 127.35744 ...
54912 0 0.0 0.0 9.0 1.0 0.0 0.0 0.0 15.0 8.0 0.0 None

54913 rows × 12 columns

In [52]:
df11 = pd.read_csv('도로명주소_건물.csv')
In [53]:
df11.iloc[:,1:5]
Out[53]:
gid building house office
0 다바866110 6 6 0
1 다바823157 2 2 0
2 다바928260 8 5 0
3 다바931203 2 0 0
4 다바836109 1 1 0
... ... ... ... ...
54907 다바861065 0 0 0
54908 다바912036 0 0 0
54909 다바867189 0 0 0
54910 다바851062 0 0 0
54911 다바924104 0 0 0

54912 rows × 4 columns

In [15]:
traffic2 = traffic.loc[:, ['가해운전자 차종', '가해운전자 연령대', '가해운전자 성별', '피해운전자 차종', '피해운전자 연령대',
       '피해운전자 성별', 'year', '사고', '유형', '동', 'gid', 'geometry']]
In [ ]:
 

사고 유형

In [16]:
traffic2.groupby(['사고'])[['gid']].count()
Out[16]:
gid
사고
차대사람 4687
차대차 18253
차량단독 712
In [ ]:
 
In [23]:
traffic2.groupby(['유형'])[['gid']].count().sort_values(by='gid', ascending=False)
Out[23]:
gid
유형
측면충돌 7574
기타 7565
추돌 4400
횡단중 2099
정면충돌 593
후진중충돌 353
길가장자리구역통행중 327
차도통행중 325
보도통행중 187
공작물충돌 135
전도전복 81
주/정차차량 충돌 7
도로외이탈 6
In [18]:
traffic2.groupby(['사고','유형'])[['gid']].count()
Out[18]:
gid
사고 유형
차대사람 기타 1749
길가장자리구역통행중 327
보도통행중 187
차도통행중 325
횡단중 2099
차대차 기타 5333
정면충돌 593
추돌 4400
측면충돌 7574
후진중충돌 353
차량단독 공작물충돌 135
기타 483
도로외이탈 6
전도전복 81
주/정차차량 충돌 7
In [21]:
traffic2.groupby(['사고','가해운전자 연령대'])[['gid']].count()
Out[21]:
gid
사고 가해운전자 연령대
차대사람 10대 86
10대미만 2
20대 694
30대 714
40대 900
50대 1163
60대 713
70대 204
80대 24
미분류 187
차대차 10대 304
10대미만 6
20대 2659
30대 2976
40대 3474
50대 4302
60대 3178
70대 982
80대 132
90대 2
기타불명 2
미분류 236
차량단독 10대 25
10대미만 1
20대 63
30대 57
40대 151
50대 285
60대 110
70대 14
80대 4
미분류 2
In [101]:
traffic2.loc[traffic2['사고'] == '차대차'].groupby(['gid'])[['사고']].count().sort_values(by='사고', ascending=False)[:100]
Out[101]:
사고
gid
다바825181 55
다바911168 54
다바831220 51
다바882173 47
다바877174 47
... ...
다바891196 19
다바856169 19
다바947171 19
다바893145 19
다바902158 19

100 rows × 1 columns

In [32]:
traffic2.loc[traffic2['사고'] == '차대차'].groupby(['동','gid'])[['사고']].count().sort_values(by='사고', ascending=False)[:10]
Out[32]:
사고
gid
갈마동 다바882173 47
다바883172 46
봉명동 다바857173 44
노은동 다바841188 40
봉명동 다바863171 39
월평동 다바877178 38
갈마동 다바882172 37
부사동 다바941128 37
반석동 다바831220 37
성남동 다바942159 36
In [28]:
a11 = traffic2.loc[(traffic2['gid'] == '다바882173') | (traffic2['gid'] == '다바883172') 
              | (traffic2['gid'] == '다바857173') | (traffic2['gid'] == '다바841188') 
              | (traffic2['gid'] == '다바863171') | (traffic2['gid'] == '다바877178')
              | (traffic2['gid'] == '다바882172') | (traffic2['gid'] == '다바941128') 
              | (traffic2['gid'] == '다바831220') | (traffic2['gid'] == '다바942159') ]
In [62]:
a11.loc[(a11['gid'] == '다바882173') | (a11['gid'] == '다바883172') 
              | (a11['gid'] == '다바882172')].groupby('유형')[['사고']].count()
Out[62]:
사고
유형
공작물충돌 1
기타 51
보도통행중 1
정면충돌 4
추돌 23
측면충돌 54
횡단중 4
In [64]:
a11.loc[a11['gid'] == '다바882172'].groupby('유형')[['사고']].count()
Out[64]:
사고
유형
기타 18
보도통행중 1
추돌 5
측면충돌 16
횡단중 2
In [77]:
a11.groupby('유형')[['사고']].count()
Out[77]:
사고
유형
공작물충돌 1
기타 141
보도통행중 3
정면충돌 17
추돌 107
측면충돌 162
횡단중 16
후진중충돌 2
In [29]:
a11_a = gpd.GeoDataFrame(a11, geometry='geometry')
In [30]:
f1 = np.stack([a11_a['geometry'].centroid.x, a11_a['geometry'].centroid.y], axis=1).reshape([1, -1, 2])
a11_a['사고_경도'] = f1[0,:,0]
a11_a['사고_위도'] = f1[0,:,1]
/opt/app-root/lib/python3.6/site-packages/ipykernel_launcher.py:1: UserWarning: Geometry is in a geographic CRS. Results from 'centroid' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.

  """Entry point for launching an IPython kernel.
In [48]:
a11_a['사고_경도'] = a11_a['사고_경도'].astype(float)
a11_a['사고_위도'] = f1[0,:,1].astype(float)
In [13]:
import folium

center = (36.353492, 127.369042); zoom = 15

m = folium.Map(location=center, zoom_start=zoom)
m
Out[13]:
Make this Notebook Trusted to load map: File -> Trust Notebook
In [59]:
## 위치를 지도에서 확인합니다.
import folium

for index, row in a11_a.iterrows():
    folium.Marker([row['사고_위도'], row['사고_경도']], 
                   popup=row['gid'],
                   icon=folium.Icon(color='green', icon_color='white')).add_to(m)
    
m
Out[59]:
Make this Notebook Trusted to load map: File -> Trust Notebook
In [65]:
data_final_pop.loc[(data_final_pop['gid'] == '다바882173') | (data_final_pop['gid'] == '다바883172') 
              | (data_final_pop['gid'] == '다바882172')]
Out[65]:
gid cars_cnt cctv_cnt safteysign_cnt speed_cnt PTL_cnt CTL_cnt SafeZone_cnt nostop_cnt medianstrip_cnt Pedcrossing_cnt building house office
21207 다바882172 11.0 0.0 8.0 0.0 3.0 6.0 1.0 0.0 0.0 2.0 10.0 1.0 3.0
21208 다바882173 27.0 0.0 10.0 5.0 4.0 11.0 1.0 0.0 0.0 2.0 17.0 8.0 1.0
21452 다바883172 49.0 0.0 7.0 0.0 1.0 8.0 0.0 0.0 0.0 1.0 17.0 11.0 3.0
In [ ]:
 

측면충돌

In [77]:
x1 = traffic2.loc[traffic2['유형'] == '측면충돌'].groupby('gid')[['사고']].count().sort_values(by='사고', ascending=False)[:100]
pd.set_option('display.max_rows', x1.shape[0]+1)
x1
In [84]:
x2 = traffic2.loc[(traffic2['gid'] == '다바936147') | (traffic2['gid'] == '다바911168') 
              | (traffic2['gid'] == '다바947170') | (traffic2['gid'] == '다바882173') 
              | (traffic2['gid'] == '다바892163') | (traffic2['gid'] == '다바941128')
              | (traffic2['gid'] == '다바907153') | (traffic2['gid'] == '다바914145')
              | (traffic2['gid'] == '다바951164') | (traffic2['gid'] == '다바825181')]

x2
Out[84]:
가해운전자 차종 가해운전자 연령대 가해운전자 성별 피해운전자 차종 피해운전자 연령대 피해운전자 성별 year 사고 유형 gid geometry
298 승용 30대 승용 50대 2017 차대차 측면충돌 탄방동 다바892163 MULTIPOLYGON (((127.37965 36.34404, 127.37964 ...
299 승용 40대 승용 60대 2017 차대차 추돌 둔산동 다바892163 MULTIPOLYGON (((127.37965 36.34404, 127.37964 ...
300 승용 60대 승용 30대 2017 차대차 측면충돌 탄방동 다바892163 MULTIPOLYGON (((127.37965 36.34404, 127.37964 ...
301 승용 40대 승용 50대 2017 차대차 측면충돌 탄방동 다바892163 MULTIPOLYGON (((127.37965 36.34404, 127.37964 ...
302 승용 50대 승용 30대 2017 차대차 추돌 탄방동 다바892163 MULTIPOLYGON (((127.37965 36.34404, 127.37964 ...
... ... ... ... ... ... ... ... ... ... ... ... ...
18239 승용 40대 승용 60대 2018 차대차 측면충돌 가양동 다바947170 MULTIPOLYGON (((127.44093 36.35039, 127.44093 ...
18240 화물 50대 승용 30대 2018 차대차 기타 가양동 다바947170 MULTIPOLYGON (((127.44093 36.35039, 127.44093 ...
18241 승용 50대 승용 30대 2018 차대차 측면충돌 용전동 다바947170 MULTIPOLYGON (((127.44093 36.35039, 127.44093 ...
18242 이륜 80대 승용 50대 2019 차대차 기타 가양동 다바947170 MULTIPOLYGON (((127.44093 36.35039, 127.44093 ...
18243 승용 40대 승용 30대 2019 차대차 추돌 용전동 다바947170 MULTIPOLYGON (((127.44093 36.35039, 127.44093 ...

451 rows × 12 columns

In [ ]:
 
In [83]:
data_final_pop.loc[(data_final_pop['gid'] == '다바936147') | (data_final_pop['gid'] == '다바911168') 
              | (data_final_pop['gid'] == '다바947170') | (data_final_pop['gid'] == '다바882173') 
              | (data_final_pop['gid'] == '다바892163') | (data_final_pop['gid'] == '다바941128')
              | (data_final_pop['gid'] == '다바907153') | (data_final_pop['gid'] == '다바914145')
              | (data_final_pop['gid'] == '다바951164') | (data_final_pop['gid'] == '다바825181')]
Out[83]:
gid cars_cnt cctv_cnt safteysign_cnt speed_cnt PTL_cnt CTL_cnt SafeZone_cnt nostop_cnt medianstrip_cnt Pedcrossing_cnt building house office
6840 다바825181 0.0 2.0 30.0 0.0 8.0 12.0 7.0 0.0 0.0 8.0 0.0 0.0 0.0
21208 다바882173 27.0 0.0 10.0 5.0 4.0 11.0 1.0 0.0 0.0 2.0 17.0 8.0 1.0
23677 다바892163 0.0 0.0 23.0 1.0 3.0 9.0 0.0 0.0 0.0 3.0 2.0 0.0 0.0
27851 다바907153 9.0 0.0 5.0 4.0 3.0 4.0 0.0 0.0 0.0 2.0 6.0 0.0 1.0
29021 다바911168 47.0 2.0 13.0 6.0 4.0 13.0 0.0 0.0 0.0 1.0 14.0 14.0 0.0
29839 다바914145 13.0 0.0 15.0 0.0 4.0 5.0 0.0 0.0 0.0 4.0 12.0 2.0 1.0
35864 다바936147 0.0 0.0 7.0 1.0 5.0 12.0 0.0 1.0 0.0 2.0 2.0 1.0 1.0
37271 다바941128 15.0 2.0 22.0 3.0 8.0 13.0 1.0 0.0 0.0 6.0 22.0 2.0 1.0
39034 다바947170 1.0 0.0 17.0 4.0 4.0 5.0 5.0 0.0 0.0 3.0 1.0 0.0 0.0
40158 다바951164 5.0 0.0 24.0 2.0 8.0 12.0 7.0 0.0 0.0 8.0 8.0 0.0 2.0
In [85]:
x2_a = gpd.GeoDataFrame(x2, geometry='geometry')

f1 = np.stack([x2_a['geometry'].centroid.x, x2_a['geometry'].centroid.y], axis=1).reshape([1, -1, 2])
x2_a['사고_경도'] = f1[0,:,0]
x2_a['사고_위도'] = f1[0,:,1]
/opt/app-root/lib/python3.6/site-packages/ipykernel_launcher.py:3: UserWarning: Geometry is in a geographic CRS. Results from 'centroid' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.

  This is separate from the ipykernel package so we can avoid doing imports until
In [86]:
for index, row in x2_a.iterrows():
    folium.Marker([row['사고_위도'], row['사고_경도']], 
                   popup=row['gid'],
                   icon=folium.Icon(color='red', icon_color='white')).add_to(m)
    
m
Out[86]:
Make this Notebook Trusted to load map: File -> Trust Notebook
In [87]:
data_final_pop.loc[(data_final_pop['gid'] == '다바889167') | (data_final_pop['gid'] == '다바898131') 
              | (data_final_pop['gid'] == '다바943156') | (data_final_pop['gid'] == '다바894178') 
              | (data_final_pop['gid'] == '다바878174') | (data_final_pop['gid'] == '다바950143')
              | (data_final_pop['gid'] == '다바856116') | (data_final_pop['gid'] == '다바891171')
              | (data_final_pop['gid'] == '다바904196') | (data_final_pop['gid'] == '다바846172')]
Out[87]:
gid cars_cnt cctv_cnt safteysign_cnt speed_cnt PTL_cnt CTL_cnt SafeZone_cnt nostop_cnt medianstrip_cnt Pedcrossing_cnt building house office
11728 다바846172 0.0 0.0 10.0 6.0 4.0 9.0 0.0 0.0 0.0 2.0 3.0 0.0 0.0
14222 다바856116 2.0 0.0 18.0 6.0 3.0 8.0 4.0 0.0 0.0 2.0 1.0 0.0 1.0
20229 다바878174 21.0 0.0 9.0 5.0 1.0 4.0 1.0 0.0 0.0 1.0 5.0 5.0 0.0
22922 다바889167 0.0 2.0 23.0 0.0 3.0 4.0 4.0 0.0 0.0 3.0 1.0 0.0 0.0
23429 다바891171 0.0 0.0 14.0 7.0 2.0 1.0 1.0 0.0 0.0 1.0 2.0 0.0 1.0
24206 다바894178 6.0 0.0 7.0 5.0 1.0 5.0 4.0 0.0 0.0 0.0 1.0 0.0 0.0
25217 다바898131 3.0 0.0 13.0 4.0 6.0 8.0 0.0 0.0 0.0 3.0 7.0 3.0 2.0
27022 다바904196 0.0 0.0 13.0 3.0 5.0 7.0 0.0 0.0 0.0 3.0 0.0 0.0 0.0
37874 다바943156 5.0 0.0 21.0 0.0 3.0 5.0 3.0 0.0 0.0 2.0 9.0 9.0 0.0
39856 다바950143 14.0 0.0 24.0 6.0 8.0 10.0 0.0 0.0 0.0 6.0 14.0 9.0 2.0
In [89]:
xx2_a = gpd.GeoDataFrame(xx2, geometry='geometry')

f1 = np.stack([xx2_a['geometry'].centroid.x, xx2_a['geometry'].centroid.y], axis=1).reshape([1, -1, 2])
xx2_a['사고_경도'] = f1[0,:,0]
xx2_a['사고_위도'] = f1[0,:,1]
/opt/app-root/lib/python3.6/site-packages/ipykernel_launcher.py:3: UserWarning: Geometry is in a geographic CRS. Results from 'centroid' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.

  This is separate from the ipykernel package so we can avoid doing imports until
In [91]:
for index, row in xx2_a.iterrows():
    folium.Marker([row['사고_위도'], row['사고_경도']], 
                   popup=row['gid'],
                   icon=folium.Icon(color='blue', icon_color='white')).add_to(m)
    
m
Out[91]:
Make this Notebook Trusted to load map: File -> Trust Notebook
In [ ]:
 

차대차 top10

In [34]:
a1 = data_final_pop.loc[(data_final_pop['gid'] == '다바882173') | (data_final_pop['gid'] == '다바883172') 
              | (data_final_pop['gid'] == '다바857173') | (data_final_pop['gid'] == '다바841188') 
              | (data_final_pop['gid'] == '다바863171') | (data_final_pop['gid'] == '다바877178')
              | (data_final_pop['gid'] == '다바882172') | (data_final_pop['gid'] == '다바941128')
              | (data_final_pop['gid'] == '다바831220') | (data_final_pop['gid'] == '다바942159')]
In [35]:
a2 = 교통사고격자.loc[(교통사고격자['gid'] == '다바882173') | (교통사고격자['gid'] == '다바883172') 
              | (교통사고격자['gid'] == '다바857173') | (교통사고격자['gid'] == '다바841188') 
              | (교통사고격자['gid'] == '다바863171') | (교통사고격자['gid'] == '다바877178')
              | (교통사고격자['gid'] == '다바882172') | (교통사고격자['gid'] == '다바941128')
              | (교통사고격자['gid'] == '다바831220') | (교통사고격자['gid'] == '다바942159')]
In [38]:
aa = pd.merge(a1,a2, on = 'gid')
aa
Out[38]: